package com.diaohw.platform.framework.redis.util;

import cn.hutool.extra.spring.SpringUtil;
import org.springframework.data.redis.core.HashOperations;

import java.util.List;
import java.util.Map;

import static com.diaohw.platform.framework.redis.util.RedisUtil.expire;
import static com.diaohw.platform.framework.redis.util.RedisUtil.expireTime;

/**
 * Redis Hash 工具类
 *
 * @author 刁海文
 * @since 2023/9/19 20:34
 */
public class RedisHashUtil {
    private final static HashOperations hash = SpringUtil.getBean(HashOperations.class);


    /**
     * HashSet
     *
     * @param key     键 不能为null
     * @param itemKey 项 不能为null
     */
    public static <T> T itemVal(String key, String itemKey) {
        return (T) hash.get(key, itemKey);
    }

    /**
     * 获取hashKey对应的所有键值
     *
     * @param key 键
     * @return 对应的多个键值
     */
    public static <T> Map<String, T> entries(String key) {
        return hash.entries(key);
    }

    /**
     * 获取hashKey对应的所有的值
     *
     * @param key 键
     * @return 对应的多个键值
     */
    public static <T> List<T> values(String key) {
        return hash.values(key);
    }

    /**
     * HashSet
     *
     * @param key 键
     * @param map 对应多个键值
     */
    public static <T> void putAll(String key, Map<String, T> map) {
        putAll(key, map, expireTime);
    }


    /**
     * HashSet 并设置时间
     *
     * @param key  键
     * @param map  对应多个键值
     * @param time 时间(秒)
     * @return true成功 false失败
     */
    public static <T> boolean putAll(String key, Map<String, T> map, long time) {
        hash.putAll(key, map);
        return expire(key, time);

    }


    /**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @return true 成功 false失败
     */
    public static <T> void put(String key, String item, T value) {
        put(key, item, value, expireTime);

    }

    /**
     * 向一张hash表中放入数据,如果不存在将创建
     *
     * @param key   键
     * @param item  项
     * @param value 值
     * @param time  时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
     * @return true 成功 false失败
     */
    public static <T> boolean put(String key, String item, T value, long time) {
        hash.put(key, item, value);
        return expire(key, time);
    }


    /**
     * 删除hash表中的值
     *
     * @param key  键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    public static Long hashDel(String key, Object... item) {
        return hash.delete(key, item);
    }


    /**
     * 判断hash表中是否有该项的值
     *
     * @param key     键 不能为null
     * @param itemKey 项 不能为null
     * @return true 存在 false不存在
     */
    public static Boolean existHashKey(String key, String itemKey) {
        return hash.hasKey(key, itemKey);
    }


    /**
     * hash递增/递减 如果不存在,就会创建一个 并把新增后的值返回
     *
     * @param key  键
     * @param item 项
     */
    public static Long hashIncr(String key, String item) {
        return hashIncr(key, item, 1L);
    }

    /**
     * hash递增/递减 如果不存在,就会创建一个 并把新增后的值返回
     *
     * @param key   键
     * @param item  项
     * @param delta 要增加几(大于0)
     */
    public static Long hashIncr(String key, String item, long delta) {
        return hash.increment(key, item, delta);
    }


}
